package top.wardyan.common.util;

import java.nio.charset.Charset;

import cn.hutool.crypto.symmetric.AES;

/**
 * 专用的AES加密方案,可与python互通,基于hutool的AES加密方案(依赖hutool)
 * @author harrydeep@wardyan.top
 * 2021年12月9日
 */
public class WAESUtil {
	
	private static final byte[] IV = "harrydeep@wardya".getBytes(Charset.forName("utf8"));
	

	
	private static AES getInstance(String key) {
		if(key == null) {
			key = "";
		}
		var b = key.getBytes();
		while(b.length % 16 != 0) {
			byte[] arr_combined = new byte[b.length+1];
			System.arraycopy(b, 0, arr_combined, 0, b.length);
			arr_combined[b.length]='\0';
			b = arr_combined;
		}
//		System.out.println(b.length);
//		System.out.println(b);
		// System.out.println(str.getBytes().length);
		return  new AES("CBC", "PKCS7Padding"
				, b		// 密钥，可以自定义		// "0123456789ABHAEQ".getBytes()
				, IV	// iv加盐，按照实际需求添加		// , "0123456789ABHAEQ".getBytes()
				);
	}
	
	/**
	 * 加密
	 * @param key	密钥
	 * @param data	明文
	 * @return		加密后的十六进制表示
	 */
	public static String encrypt(String key, String data) {
		return getInstance(key).encryptHex(data);		// 加密为16进制表示		// .toUpperCase()	// 不要默认大写
	}
	
	/**
	 * 解密
	 * @param key
	 * @param data
	 * @return
	 */
	public static String decrypt(String key, String data) {
		return getInstance(key).decryptStr(data);		// 加密为16进制表示	// 统一大写
	}
	
	public static void main(String[] args) {
		System.out.println(encrypt("你好", "when"));
		System.out.println(encrypt("你好", "when").toUpperCase());
		//System.out.println(encrypt("", ""));
		// System.out.println(AESUtil.encrypt("when", "你好"));
		
//		b991370f70579c9afa132796aea2839a
//		B991370F70579C9AFA132796AEA2839A
		System.out.println(decrypt("你好", "b991370f70579c9afa132796aea2839a"));
		System.out.println(decrypt("你好", "B991370F70579C9AFA132796AEA2839A"));
		
	}

}
